home *** CD-ROM | disk | FTP | other *** search
- {
- >so it appears nothing happened). I have seen some Programs that are
- >able to save the Dos font into a buffer in the Program and then just
- >set the video card back to that font when the Program quits. The problem
- >is, I have not seen any documented Dos interrupt that will allow me to
- >do this.
- > I'm wondering if anyone knows of such an interrupt that I can use to
- > get the current VGA font and save it to a buffer.
- > Any help would be greatly appreciated!
-
- Interrupt $10 is what you're looking For. Function $11,
- subFunction $30 gets the Character generator info.
- Function $11, subFunction $10 loads user fonts. Function $11 can
- also be used to Reset to one of the hardware fonts (subFunction
- $11 Resets to ROM 8x14, $12 Resets to ROM 8x8, $14 Resets to VGA
- ROM 8x16)
-
- The structure Types are as follows:
- }
- Type
-
- { enumerated font Type }
- ROMfont = (ROM8x14, ROM8x8, ROM8x16);
-
- { Character definition table }
- CharDefTable = Array[0..4096] of Byte;
- CharDefPtr = ^CharDefTable;
-
- { Text Character generator table }
- Char_Table = Record
- Points :Byte;
- Def :CharDefPtr;
- end;
-
- { font Format }
- FontPackage = Record
- FontInfo :Char_Table;
- Ch :CharDefTable;
- end;
- FontPkgPtr = ^FontPackage;
-
- { Here are some handy Procedures to use those Types: }
-
- Procedure GetCharGenInfo(font: ROMfont; Var Table:Char_Table);
- begin
- if is_EGA then
- begin
- Reg.AH := $11;
- Reg.AL := $30;
- Case font of
- ROM8x8 : Reg.BH := 3;
- ROM8x14: Reg.BH := 2;
- ROM8x16: Reg.BH := 6;
- end;
- Intr($10, Reg);
- Table.Def := Ptr(Reg.ES, Reg.BP);
- Case font of
- ROM8x8 : Table.Points := 8;
- ROM8x14: Table.Points := 14;
- ROM8x16: Table.Points := 16;
- end;
- end;
- end;
-
- Procedure SetHardwareFont(Var font :ROMfont);
- begin
- if is_EGA then
- begin
- Reg,AH := $11;
- Case font of
- ROM8x14 : Reg.AL := $11;
- ROM8x8 : Reg.AL := $12;
- ROM8x16 :
- if is_VGA then
- Reg.AL := $14 { 8x16 on VGA only }
- else
- begin
- Reg.AL := $12;
- font := ROM8x14;
- end;
- end;
- Reg.BL := 0;
- Intr($10, Reg);
- end;
- end;
-
- Function FetchHardwareFont(font :ROMfont):FontPkgPtr;
- Var
- pkg :FontPkgPtr;
- begin
- New(pkg);
- GetCharGenInfo(font, Pkg^.FontInfo);
- Pkg^.Ch := Pkg^.FontInfo.Def^;
- FetchHardwareFont := Pkg;
- end;
-
- Procedure LoadUserFont(pkg :FontPkgPtr);
- begin
- Reg.AH := $11;
- Reg.AL := $10;
- Reg.ES := Seg(pkg^.ch);
- Reg.BP := Ofs(pkg^.ch);
- Reg.BH := Pkg^.FontInfo.Points;
- Reg.BL := 0;
- Reg.CX := 256;
- Reg.DX := 0;
- Intr($10, Reg);
- end;
-